package com.yx;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class SocketProcessor implements Runnable{
private Socket socket;
private Tomcat tomcat;

//构造方法
public SocketProcessor(Socket socket,Tomcat tomcat) {
    this.socket = socket;
    this.tomcat = tomcat;
}
    //在tomcat中还没有调用SocketProcessor的run方法
    @Override
    public void run() {
    processSocket(socket);
}

    private void processSocket(Socket socket) {
    //处理socket连接  读数据 写数据

        try{
        //读数据
        InputStream inputStream = socket.getInputStream();
        //设置字节数组，读取字节流
        byte[] bytes = new byte[1024];
        inputStream.read(bytes);
        //http协议解析 请求方法[空格]url[空格]协议版本[回车换行]
        //解析字节流，遇到一个空格就退出，此处解析的是请求方法
            int pos =0;
            int begin=0,end=0;
            for(;pos<bytes.length;pos++,end++){
                if(bytes[pos]==' ') break;
            }
        //组合空格之前的字节流，转换成字符串就是请求方法
            StringBuilder method=new StringBuilder();
            for(;begin<end;begin++){
                method.append((char)bytes[begin]);
            }
            //解析url
            pos++;
            begin++;
            end++;
            for(;pos<bytes.length;pos++,end++){
                if(bytes[pos]==' ') break;
            }
            StringBuilder url=new StringBuilder();
            for (;begin<end;begin++){
                url.append((char)bytes[begin]);
            }
            //解析协议版本
            pos++;
            begin++;
            end++;
            for(;pos<bytes.length;pos++,end++)
            {
                //不够准确
                if (bytes[pos]=='\r') break;
            }
            StringBuilder protocl= new StringBuilder();
            for(;begin<end;begin++){
                protocl.append((char)bytes[begin]);
            }
            //tomcat对象  解析数据去获取请求 创建请求体和响应体
            Request request =new Request(method.toString(),url.toString(),protocl.toString(),socket);
            Response response =new Response(request);

            //获取请求的url，截取appName，根据appName获取context对象，根据url截取urlPattern，根据urlPattern获取servlet对象
            String requestUrl=request.getRequestURL().toString();
            System.out.println(requestUrl);
            requestUrl=requestUrl.substring(1);
            String[] parts=requestUrl.split("/");
            String appName=parts[0];
            Context context=tomcat.getContextMap().get(appName);
            //因为urlPattern返回了两个值，第二个值没有parts[1]造成了数组越界，所以进行判断。
            if(parts.length>1){
            Servlet servlet=context.getByUrlPattern(parts[1]);
            //有的时候会出现应用下没有对应的servlet的情况，对该情况进行处理。
            if(servlet!=null){
            servlet.service(request,response);
            //发送响应
            response.complete();}
            else{
                DefaultServlet defaultServlet=new DefaultServlet();
                defaultServlet.service(request,response);
                response.complete();
            }
            }
    } catch (ServletException | IOException e) {
            throw new RuntimeException(e);
        }
    }
}
